<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var foo = 'hello';

        /* 
        我知道的立即执行函数三种写法之一：
        ! function(foo) {
             console.log(foo);
             var foo = foo || 'world';
             console.log(foo);
         }(foo); 
         */
        /* 
        我知道的立即执行函数三种写法之一：
         (function(foo) {
            console.log(foo);
            var foo = foo || 'world';
            console.log(foo);
        })(foo);
         */
        (function(foo) {
            console.log(foo);
            var foo = foo || 'world';
            console.log(foo);
        }(foo));
        console.log(foo);

        // 需要注意的是:在立即执行函数中 形参的foo 相当于在执行上下文的时候执行了var foo = undefined
        //当一个变量已经使用var 定义了再次定义不管有没有赋值，都不会变量提升,并且如果再次定义没有赋值，这个变量的值还是之前赋的值  
        /* 
        var a = 10;
        console.log(a);
        var a = 11; 
        console.log里面输出的是10
        */
    </script>
</body>

</html>